package com.ruoyi.mongo.util;

import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.model.Filters;
import com.ruoyi.mongo.souce.MongoDB04AuthPoolUtil;
import com.ruoyi.util.DateUtil;
import org.bson.Document;
import org.bson.types.ObjectId;
import java.util.Date;
import java.util.regex.Pattern;

/**
 * @Description: 查询文档
 * @ClassName: MongoTest04Select
 * @author syc
 * @date: 2022年5月25日 上午11:45:55
 */
public class MongoTest04Select {

	/**
	 * @Description: 测试
	 * @author syc
	 * @date: 2022年5月25日 上午11:53:06
	 */
	public static void main(String[] args) {
		MongoTest04Select docu = new MongoTest04Select();
		// docu.selectDocumentAll(); // 01
		// docu.selectDocumentById(); // 02
		// docu.selectDocumentConditionByGt(); // 03
		// docu.selectDocumentConditionByType(); // 04
		// docu.selectDocumentConditionByIn(); // 05
		// docu.selectDocumentConditionByNin(); // 06
		// docu.selectDocumentConditionByRegex(); // 07
		// docu.selectDocumentConditionByRegex02(); // 08
		// docu.selectDocumentConditionByRegex03(); // 09
		// docu.selectDocumentConditionUseAnd(); // 10
		// docu.selectDocumentConditionUseOr(); // 11
		// docu.selectDocumentConditionUseAndOr(); // 12
		// docu.selectDocumentConditionSorting(); // 13
		// docu.selectDocumentJson(); // 14
		// docu.selectDocumentArray(); // 15
		// docu.selectDocumentByPageUseSkipAndLimit(1,5); // 16
		// docu.selectDocumentByPageUseCondition(2,5,"6285f5eda769dd3474683339"); // 17
		// docu.selectDocumentDateUseEq(); // 17
		docu.selectDocumentDateUseGt(); // 18

	}

	/**
	 * @Description: 01查询全部文档
	 * @author syc
	 * @date: 2022年5月25日 上午11:51:58
	 */
	public void selectDocumentAll() {
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		// 返回的是一个文档的迭代器
		FindIterable<Document> iterable = collection.find();
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			Document docu = cursor.next();
			System.out.println(
					docu.get("name") + "\t" + docu.get("age") + "\t" + docu.get("score") + "\t" + docu.get("hobbys"));
		}
	}

	/**
	 * @Description: 02根据_id查询文档
	 * @author syc
	 * @date: 2022年5月25日 下午2:04:52
	 */
	public void selectDocumentById() {
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		FindIterable<Document> iterable = collection.find(Filters.eq("_id", new ObjectId("62873282333e4210b34cc185")));
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			Document docu = cursor.next();
			System.out.println(
					docu.get("name") + "\t" + docu.get("age") + "\t" + docu.get("score") + "\t" + docu.get("hobbys"));
		}
	}

	/**
	 * @Description: 03 根据年龄查询文档,条件是年龄大于19
	 * @author syc
	 * @date: 2022年5月25日 下午2:06:41
	 */
	public void selectDocumentConditionByGt() {
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		FindIterable<Document> iterable = collection.find(Filters.gt("age", 19));
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			Document docu = cursor.next();
			System.out.println(
					docu.get("name") + "\t" + docu.get("age") + "\t" + docu.get("score") + "\t" + docu.get("hobbys"));
		}
	}

	/**
	 * @Description: 04根据年龄数据类型查询文档,年龄的值是整数类型(number)
	 * @author syc
	 * @date: 2022年5月25日 下午2:07:47
	 */
	public void selectDocumentConditionByType() {
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		FindIterable<Document> iterable = collection.find(Filters.type("age", "number"));
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			Document docu = cursor.next();
			System.out.println(
					docu.get("name") + "\t" + docu.get("age") + "\t" + docu.get("score") + "\t" + docu.get("hobbys"));
		}
	}

	/**
	 * @Description: 05使用in方法查询
	 * @author syc
	 * @date: 2022年5月25日 下午2:19:03
	 */
	public void selectDocumentConditionByIn() {
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		FindIterable<Document> iterable = collection.find(Filters.in("name", "卫何民0", "王天河"));
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			Document docu = cursor.next();
			System.out.println(
					docu.get("name") + "\t" + docu.get("age") + "\t" + docu.get("score") + "\t" + docu.get("hobbys"));
		}
	}

	/**
	 * @Description: 06使用 nin方法查询
	 * @author syc
	 * @date: 2022年5月25日 下午2:21:37
	 */
	public void selectDocumentConditionByNin() {
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		FindIterable<Document> iterable = collection.find(Filters.nin("name", "卫何民0", "王天河"));
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			Document docu = cursor.next();
			System.out.println(
					docu.get("name") + "\t" + docu.get("age") + "\t" + docu.get("score") + "\t" + docu.get("hobbys"));
		}
	}

	/**
	 * @Description: 07根据用户的名字模糊搜索赵开头山结尾的文档
	 * @author syc
	 * @date: 2022年5月25日 下午2:24:09
	 */
	public void selectDocumentConditionByRegex() {
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		FindIterable<Document> iterable = collection.find(Filters.regex("name", Pattern.compile("^赵.*山$")));
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			Document docu = cursor.next();
			System.out.println(
					docu.get("name") + "\t" + docu.get("age") + "\t" + docu.get("score") + "\t" + docu.get("hobbys"));
		}
	}

	/**
	 * @Description: 08根据用户的名字模糊搜索赵开头的文档
	 * @author syc
	 * @date: 2022年5月25日 下午2:24:09
	 */
	public void selectDocumentConditionByRegex02() {
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		FindIterable<Document> iterable = collection.find(Filters.regex("name", Pattern.compile("^赵.*$"))); // 也可以省略为
																											// "^赵"
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			Document docu = cursor.next();
			System.out.println(
					docu.get("name") + "\t" + docu.get("age") + "\t" + docu.get("score") + "\t" + docu.get("hobbys"));
		}
	}

	/**
	 * @Description: 09根据用户的名字模糊搜索0结尾的文档
	 * @author syc
	 * @date: 2022年5月25日 下午2:24:09
	 */
	public void selectDocumentConditionByRegex03() {
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		FindIterable<Document> iterable = collection.find(Filters.regex("name", Pattern.compile("^.*0$"))); // 也可以省略为
																											// "0$"
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			Document docu = cursor.next();
			System.out.println(
					docu.get("name") + "\t" + docu.get("age") + "\t" + docu.get("score") + "\t" + docu.get("hobbys"));
		}
	}

	/**
	 * @Description: 10使用and搜索文档
	 * @author syc
	 * @date: 2022年5月25日 下午2:31:17
	 */
	public void selectDocumentConditionUseAnd() {
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		FindIterable<Document> iterable = collection
				.find(Filters.and(Filters.eq("name", "王天河"), Filters.eq("age", 21)));
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			Document docu = cursor.next();
			System.out.println(
					docu.get("name") + "\t" + docu.get("age") + "\t" + docu.get("score") + "\t" + docu.get("hobbys"));
		}
	}

	/**
	 * @Description: 11使用or搜索文档
	 * @author syc
	 * @date: 2022年5月25日 下午7:09:02
	 */
	public void selectDocumentConditionUseOr() {
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		FindIterable<Document> iterable = collection
				.find(Filters.or(Filters.eq("name", "王天河"), Filters.eq("name", "徐丽影"), Filters.eq("sex", "女")));
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			Document docu = cursor.next();
			System.out.println(
					docu.get("name") + "\t" + docu.get("age") + "\t" + docu.get("score") + "\t" + docu.get("hobbys"));
		}
	}

	/**
	 * @Description: 12 and与or连用查询文档
	 * @author syc
	 * @date: 2022年5月25日 下午7:13:05
	 */
	public void selectDocumentConditionUseAndOr() {
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		FindIterable<Document> iterable = collection.find(
				Filters.or(Filters.and(Filters.eq("age", 21), Filters.eq("name", "赵珊珊")), Filters.eq("score", 71)));
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			Document docu = cursor.next();
			System.out.println(
					docu.get("name") + "\t" + docu.get("age") + "\t" + docu.get("score") + "\t" + docu.get("hobbys"));
		}
	}

	/**
	 * @Description: 13根据name对结果做降序排序,1升序排序,-1降序排序 $sort:{name,-1}
	 * @author syc
	 * @date: 2022年5月25日 下午7:18:54
	 */
	public void selectDocumentConditionSorting() {
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		FindIterable<Document> iterable = collection.find().sort(new Document("name", 1));
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			Document docu = cursor.next();
			System.out.println(
					docu.get("name") + "\t" + docu.get("age") + "\t" + docu.get("score") + "\t" + docu.get("hobbys"));
		}
	}

	/**
	 * @Description: 14嵌套查询
	 * @author syc
	 * @date: 2022年5月25日 下午7:18:54
	 */
	public void selectDocumentJson() {
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		FindIterable<Document> iterable = collection.find(Filters.eq("secrets.money", 98));
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			Document docu = cursor.next();
			System.out.println(
					docu.get("name") + "\t" + docu.get("age") + "\t" + docu.get("score") + "\t" + docu.get("hobbys"));
		}
	}

	/**
	 * @Description: 15以数组中的内容为条件查询文档
	 * @author syc
	 * @date: 2022年5月25日 下午7:18:54
	 *        db.test_user.find({hobbys:{$elemMatch:{$eq:"睡觉"}}})
	 */
	public void selectDocumentArray() {
		// new Document("hobbys",new Document("$elemMatch",new Document("$eq","睡觉")));
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		FindIterable<Document> iterable = collection
				.find(new Document("hobbys", new Document("$elemMatch", new Document("$eq", "睡觉"))));
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			Document docu = cursor.next();
			System.out.println(
					docu.get("name") + "\t" + docu.get("age") + "\t" + docu.get("score") + "\t" + docu.get("hobbys"));
		}
	}
	// 扩展
	// { id: 1,state_arr: [{id: 1, name: "hhh"}]}
	// db.user.find({state_arr:{$elemMatch:{id:1}}}

	/**
	 * @Description: 16通过 skip与limit方法实现分页
	 * @author syc
	 * @date: 2022年5月25日 下午7:42:51
	 */
	public void selectDocumentByPageUseSkipAndLimit(int pageNow, int pageSize) {
		int startRow = (pageNow - 1) * pageSize;
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		Document condtion = new Document();
		long countNum = collection.countDocuments(condtion);
		System.out.println(countNum);
		FindIterable<Document> iterable = collection.find(condtion).skip(startRow).limit(pageSize);
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			// Document docu = cursor.next();
			System.out.println(cursor.next());
		}
	}

	/**
	 * @Description: 17分页查询2
	 * @author syc
	 * @date: 2022年5月25日 下午7:45:34
	 */
	public void selectDocumentByPageUseCondition(int pageNow, int pageSize, String lastId) {
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		Document condtion = new Document();
		long countNum = collection.countDocuments(condtion);
		System.out.println(countNum);
		FindIterable<Document> iterable = null;
		if (pageNow == 1) {
			// 第一页查询
			iterable = collection.find(condtion).limit(pageSize);
		} else if (lastId != null) {
			// 下一页查寻
			condtion.append("_id", new Document("$gt", new ObjectId(lastId)));
			iterable = collection.find(condtion).limit(pageSize);
		} else {
			// 跳页查询
			collection.find(condtion).skip((pageNow - 1) * pageSize).limit(pageSize);
		}
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			// Document docu = cursor.next();
			System.out.println(cursor.next());
		}
	}

	/**
	 * @Description: 18查询日期: 查询创建日期为 2019-05-01 13:32:13 的用户信息
	 * @author syc
	 * @date: 2022年5月25日 下午8:02:01
	 */
	public void selectDocumentDateUseEq() {
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		Date date = DateUtil.stringToDate("2019-05-01 13:32:13", "yyyy-MM-dd HH:mm:ss");
		FindIterable<Document> iterable = collection.find(Filters.eq("create_time", date));
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			Document docu = cursor.next();
			String temp = DateUtil.dateToString(docu.getDate("create_time"), "yyyy-MM-dd HH:mm:ss");
			System.out.println(docu.get("name") + "\t" + docu.get("age") + "\t" + docu.get("sex") + "\t"
					+ docu.get("hobbys") + "\t" + temp);
		}
	}

	/**
	 * @Description: 19查询日期: 查询创建时间大于 2019-01-01 00:00:00 的用户信息
	 * @author syc
	 * @date: 2022年5月25日 下午8:05:01
	 */
	public void selectDocumentDateUseGt() {
		MongoCollection<Document> collection = MongoDB04AuthPoolUtil.getCollection("test", "test_user");
		Date date = DateUtil.stringToDate("2019-01-01 00:00:00", "yyyy-MM-dd HH:mm:ss");
		FindIterable<Document> iterable = collection.find(Filters.gt("create_time", date));
		MongoCursor<Document> cursor = iterable.iterator();
		while (cursor.hasNext()) {
			// 每掉一次next移动以下指针
			Document docu = cursor.next();
			String temp = DateUtil.dateToString(docu.getDate("create_time"), "yyyy-MM-dd HH:mm:ss");
			System.out.println(docu.get("name") + "\t" + docu.get("age") + "\t" + docu.get("sex") + "\t"
					+ docu.get("hobbys") + "\t" + temp);
		}
	}

	
	
	
	
	
	
	
}
